package com.itc.bi.utils;

import org.apache.commons.lang3.time.DateUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @BelongsProject: itc-airport-cloud
 * @BelongsPackage: com.itc.bi.utils
 * @Author: hecaiy
 * @CreateTime: 2024-09-17  22:43
 * @Description: TODO
 * @Version: 1.0
 */
public class DateUtil {


    // 日期格式正则表达式 (yyyy-MM-dd)
    private static final String DATE_PATTERN = "^\\d{4}-\\d{1,2}-\\d{1,2}$";

    // 日期时间格式正则表达式 (yyyy-MM-dd HH:mm:ss)
    private static final String DATETIME_PATTERN = "^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}$";

    public static Boolean toDate(String dateStr) {
        try {
            dateStr = dateStr.replace("/","-");
            //包含 ':' 为时间格式 其他为日期格式
            if(dateStr.contains(":")){
                return isDateTime(dateStr);
            }else {
                return isDate(dateStr);
            }
        }catch (Exception e){
            return false;
        }
    }

    /**
     * 判断是否为日期格式并验证是否合法
     * @param dateString
     * @return
     */
    public static boolean isDate(String dateString) {
        if (!dateString.matches(DATE_PATTERN)) {
            return false;
        }
        return isValidDate(dateString, "yyyy-MM-dd");
    }

    /**
     * 判断是否为日期时间格式并验证是否合法
     * @param dateString
     * @return
     */
    public static boolean isDateTime(String dateString) {
        if (!dateString.matches(DATETIME_PATTERN)) {
            return false;
        }
        return isValidDate(dateString, "yyyy-MM-dd HH:mm:ss");
    }

    public static java.sql.Date format(String dateStr) {
        dateStr = dateStr.replace("/","-");
        //包含 ':' 为时间格式 其他为日期格式
        if(dateStr.contains(":")){
            return strToDateTime(dateStr);
        }else {
            return strToDate(dateStr);
        }
    }

    /**
     * 判断是否为日期格式并验证是否合法
     * @param dateString
     * @return
     */
    public static java.sql.Date strToDate(String dateString) {
        if (!dateString.matches(DATE_PATTERN)) {
            return null;
        }
        return isValidToDate(dateString, "yyyy-MM-dd");
    }

    /**
     * 判断是否为日期时间格式并验证是否合法
     * @param dateString
     * @return
     */
    public static java.sql.Date strToDateTime(String dateString) {
        if (dateString.matches(DATETIME_PATTERN)) {
            return isValidToDate(dateString, "yyyy-MM-dd HH:mm:ss");
        }
        return null;
    }

    /**
     * 验证日期是否合法
     * @param dateString
     * @param format
     * @return
     */
    private static java.sql.Date isValidToDate(String dateString, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        // 禁用宽松模式，严格解析日期
        sdf.setLenient(false);
        try {
            Date parse = sdf.parse(dateString);
            java.sql.Date date = new java.sql.Date(parse.getTime());
            return date;
        } catch (ParseException e) {
            return null;
        }
    }

    /**
     * 验证日期是否合法
     * @param dateString
     * @param format
     * @return
     */
    private static boolean isValidDate(String dateString, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        // 禁用宽松模式，严格解析日期
        sdf.setLenient(false);
        try {
            sdf.parse(dateString);
            return true;
        } catch (ParseException e) {
            return false;
        }
    }
}
